package com.tool.weixin.api;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import net.sf.json.JSONObject;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;

import com.tool.weixin.WeixinConfig;
import com.tool.weixin.model.AccessToken;
import com.tool.weixin.util.HttpUtils;

public class OAuthApi {
	
	private static final Logger logger = org.slf4j.LoggerFactory.getLogger(OAuthApi.class);

	private static final String oauth_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
	    
	/**
     * 获得验证url
     */
    private static final String oauth_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";

	/**
     * 获得验证url
     *
     * @param appid                    凭证
     * @param url                      授权后重定向的回调链接地址
     * @param scope应用授权作用域，snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）
     * @return
     */
    public static String getOAuthURL(String url, String scope) {
        return getOAuthURL(WeixinConfig.getInstance().getAppid(), url, scope);
    }
    
    /**
     * 获得验证url
     *
     * @param appid                    凭证
     * @param url                      授权后重定向的回调链接地址
     * @param scope应用授权作用域，snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid），snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）
     * @return
     */
    public static String getOAuthURL(String appid, String url, String scope) {
        try {
            url = URLEncoder.encode(url, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            logger.error("异常", e);
        }
        return oauth_url.replace("APPID", appid).replace("REDIRECT_URI", url).replace("SCOPE", scope).replace("STATE", "1");
    }
    
    /**
     * 获得用户openid
     *
     * @param appid
     * @param appsecret
     * @param code
     * @return
     */
    public static AccessToken getOpenid(String code) {
        return getOpenid(WeixinConfig.getInstance().getAppid(), WeixinConfig.getInstance().getAppsecret(), code);
    }

    /**
     * 获得用户openid
     *
     * @param appid
     * @param appsecret
     * @param code
     * @return
     */
    public static AccessToken getOpenid(String appid, String appsecret, String code) {
        if (StringUtils.isEmpty(code)) return null;
        String requestUrl = oauth_access_token_url.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
        JSONObject jsonObject = HttpUtils.httpRequest(requestUrl, "GET", null);
        AccessToken accessToken = null;
        if (null != jsonObject) {
            try {
            	logger.debug(jsonObject.toString());
                accessToken = new AccessToken();
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
                accessToken.setOpenid(jsonObject.getString("openid"));
            } catch (Exception e) {
                logger.error("获取openid失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return accessToken;
    }
}
